package de.tg.handball.data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

import de.tg.handball.util.Util;

public class Liga implements Serializable {

	private static final long serialVersionUID = 6890723376422368394L;
	private String name;
	private String shortName;
	private Date startDate;
	private Date endDate;
	private SortedSet<Spiel> spiele = new TreeSet<Spiel>();
	private SortedSet<Spiel> ergebnisse = new TreeSet<Spiel>();
	private SortedSet<String> manschaften = new TreeSet<String>();
	private SortedSet<TabellenEintrag> tabelle = new TreeSet<TabellenEintrag>();

	public Liga(String name, Date startDate, Date endDate) {
		super();
		setName(name);
		this.startDate = startDate;
		this.endDate = endDate;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
		shortName = Util.cutName(name);
	}
	
	public String getShortName(){
		return shortName;
	}

	public Date getStartDate() {
		return startDate;
	}

	public void setStartDate(Date startDate) {
		this.startDate = startDate;
	}

	public Date getEndDate() {
		return endDate;
	}

	public void setEndDate(Date endDate) {
		this.endDate = endDate;
	}

	public List<Spiel> getSpiele() {
		List<Spiel> ret = new ArrayList<Spiel>(spiele);
		Collections.sort(ret);
		return ret;
	}
	
	public List<Spiel> getSpiele(String nameManschaft) {
		List<Spiel> ret = new ArrayList<Spiel>();

		for (Spiel spiel : spiele) {
			if (nameManschaft.equals(spiel.getHeim())
					|| nameManschaft.equals(spiel.getGast())) {
				ret.add(spiel);
			}
		}
		Collections.sort(ret);
		return ret;
	}

	public SortedSet<String> getManschaften() {
		return manschaften;
	}

	public void addSpiel(Spiel spiel) {
		if(!manschaften.contains(spiel.getHeim()))
			addManschaft(spiel.getHeim());
		if(!manschaften.contains(spiel.getGast()))
			addManschaft(spiel.getGast());
		
		if(spiele.contains(spiel))
			spiele.remove(spiel);
		this.spiele.add(spiel);
	}

	public List<TabellenEintrag> getTabelle() {
		List<TabellenEintrag> ret = new ArrayList<TabellenEintrag>(tabelle);
		Collections.sort(ret);
		Collections.reverse(ret);
		return ret;
	}

	public void setSpielFinisched(Spiel spiel) {
		TabellenEintrag heim = getTabellenEintragByName(spiel.getHeim());
		TabellenEintrag gast = getTabellenEintragByName(spiel.getGast());

		
		if (heim == null || gast == null || ergebnisse.contains(spiel))
			return;

		heim.incrementAnzSpiele();
		gast.incrementAnzSpiele();

		Integer toreHeim = spiel.getErgebniss().first;
		Integer toreGast = spiel.getErgebniss().second;

		heim.addEingeneTore(toreHeim);
		heim.addGegenTore(toreGast);

		gast.addEingeneTore(toreGast);
		gast.addGegenTore(toreHeim);

		if (toreHeim > toreGast) {
			heim.incrementGewonnen();
			gast.incrementVerloren();
		} else if (toreHeim == toreGast) {
			heim.incrementUnendschieden();
			gast.incrementUnendschieden();
		} else {
			heim.incrementVerloren();
			gast.incrementGewonnen();
		}

		ergebnisse.add(spiel);

	}

	public List<Spiel> getErgebnisse() {
		List<Spiel> ret = new ArrayList<Spiel>(ergebnisse);
		Collections.sort(ret);
		return ret;
	}

	public List<Spiel> getErgebnisse(String nameManschaft) {
		List<Spiel> ret = new ArrayList<Spiel>();

		for (Spiel spiel : ergebnisse) {
			if (nameManschaft.equals(spiel.getHeim())
					|| nameManschaft.equals(spiel.getGast())) {
				ret.add(spiel);
			}
		}

		Collections.sort(ret);
		return ret;
	}

	public void addManschaft(String man) {
		this.manschaften.add(man);
		tabelle.add(new TabellenEintrag(man));
	}

	public TabellenEintrag getTabellenEintragByName(String man) {
		Util.assertNull(name);

		for (TabellenEintrag en : tabelle) {
			if (en.getManschaft().equals(man))
				return en;
		}
		return null;
	}

	public List<Spiel> getSpeileForDate(Date datum) {
		List<Spiel> retList = new ArrayList<Spiel>();
		Calendar cal = Calendar.getInstance();
		cal.setTime(datum);
		Integer year = cal.get(Calendar.YEAR);
		Integer day = cal.get(Calendar.DAY_OF_YEAR);

		for (Spiel spiel : spiele) {
			Date speilDatum = spiel.getDatum();
			cal.setTime(speilDatum);
			Integer yearSpiel = cal.get(Calendar.YEAR);
			Integer daySpiel = cal.get(Calendar.DAY_OF_YEAR);

			if (year.equals(yearSpiel) && day.equals(daySpiel))
				retList.add(spiel);
		}

		return retList;
	}
	
	public int getSpeilePosForDate(Date datum) {
		int pos = 0;
		Calendar cal = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		setDatum(cal, datum);

		for (Spiel spiel : spiele) {
			setDatum(cal2,  spiel.getDatum());

			if (cal.after(cal2) || cal.equals(cal2))
				pos++;
			else
				return pos;
		}
		return 0;
	}
	
	public int getSpeilePosForDate(List<Spiel> spiele, Date datum) {
		int pos = 0;
		Calendar cal = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		setDatum(cal, datum);

		for (Spiel spiel : spiele) {
			setDatum(cal2,  spiel.getDatum());

			if (cal.after(cal2) || cal.equals(cal2))
				pos++;
			else
				return pos;
		}
		return 0;
	}
	
	private void setDatum(Calendar cal, Date datum){
		cal.set(Calendar.YEAR, datum.getYear());
		cal.set(Calendar.MONTH, datum.getMonth());
		cal.set(Calendar.DAY_OF_MONTH, datum.getDate());
	}

	@Override
	public String toString() {
		String ret = name + "\n\n";
		int pos = 1;
		for (TabellenEintrag eintrag : tabelle) {
			ret += pos + "\t" + eintrag + "\n";
			pos++;
		}
		ret += "\n\n";
		for (Spiel eintrag : spiele) {
			ret += eintrag + "\n";
		}
		return ret;
	}
}
